/* 
** filename:   circlePacking.cpp
** createtime: 2020-03-08
** author:     TheBadZhang
** balabalabala
*/

#include <graphics.h>
#include <ctime>
#include <cstdlib>
#include <cmath>
// #include <conio.h>


int main (int argc, char *argv []) {
	

	const unsigned int minRadius = 1;
	const unsigned int maxRadius = 35;
	// ��С�����뾶
	const unsigned int WW = 1600, WH = 1000, times = 60000;
	// ���ڿ��ȣ����ڸ߶ȣ�Ȧ��
	// �������������ڵĴ�С����������ͼƬ�Ĵ�С
	// ͼƬ������߹�С���ᱻ��С���߷Ŵ󵽴��ڴ�С
	int *circleList = new int[3 * times];
	// 0 Ϊ x, 1 Ϊ y, 2 Ϊ r, �Դ����� 
	// �洢ȦȦ���� 
	unsigned int count = 0;
	// ԲȦ������
	srand (time (0));
	
	initgraph (WW, WH, 0);
	setfillcolor (WHITE);
	ege_enable_aa (true);
	
	
	PIMAGE PIC = newimage ();	
	// �������ɲ�ɫ�� circlepacking
	PIMAGE CHECK = newimage (WW, WH);
	setfillcolor (WHITE, CHECK);
	// getimage (PIC, argv [1], WW, WH);
	getimage (PIC, "pic.jpg", WW, WH);
	// putimage (0, 0, PIC);
	// ��ӡͼƬ�����򱳾�Ĭ�ϴ���ɫ��ԲȦ�Ŀ�϶�����Ե���Щ�ѿ�
	// ������ͼ�ν��鲻Ҫ���ͼƬ 
	// ����ʹ�� blur ����˵����Ч����һ��
	// blur ��������Ҫ�Լ�дһ���� 


	int x, y, r, l;
	int i;
	do {
redo:
		x = rand () % WW;
		y = rand () % WH;
		r = rand () % (maxRadius - minRadius) + 1;
		// ȡģ ��ֹԲ get ���� pixel���޶�԰��СΪ 1 - 50 px
		if (getpixel (x, y, CHECK) == WHITE) goto redo;
		for (i = 0; i < count; i += 1) {
			
			l = sqrt (pow (abs (x - circleList [3*i + 0]), 2) +
			          pow (abs (y - circleList [3*i + 1]), 2))
			          - circleList [3*i + 2];
			// ��ǰ������µ����뾶
			 // �����ÿһ��Բ����������Ӧ�����Ż���������û���������µ��˺����ٶȾͷǳ�����
			r = r > l ? l : r;
			// ѡ��뾶��С����һ��
		}
		// if (r <= 0 || pic [x + WW * y] == bgcolor) goto redo;
		if (r <= 0) goto redo;
		// ������Ϸ��������� 
		// Ҳ����ԲҪ�ǳ������˱��Բ��������������
		
		
		setcolor (0xff000000 + getpixel (x, y, PIC));
		setfillcolor (0xff000000 + getpixel (x, y, PIC));
		ege_fillellipse (x - r, y - r, 2 * r, 2 * r);
		// setcolor (getpixel (x, y, PIC));
		// setfillcolor (getpixel (x, y, PIC));
		// circle (x, y, r);
		// �ֶ�ѡ��ʵ�Ļ��ǿ���
		// fillellipse (x, y, r, r);
		// ����ͼ��
		
		
		
		circleList [count * 3 + 0] = x;
		circleList [count * 3 + 1] = y;
		circleList [count * 3 + 2] = r;
		// �������� 
		fillellipse (x, y, r, r, CHECK);
		// �����ж�Բ���Ƿ�Ϲ� 
		count += 1;
		// ����ֵ��һ
		
	} while (count < times);
	// imagefilter_blurring (NULL, 0xFF, 0xFF);
	getch ();
	closegraph ();
	
	return 0;
}
